import { Injectable, ExecutionContext, UnauthorizedException } from '@nestjs/common'
import { AuthGuard } from '@nestjs/passport'

/**
 * 本地认证守卫
 * 用于用户名密码登录验证
 */
@Injectable()
export class LocalAuthGuard extends AuthGuard('local') {
  /**
   * 判断是否可以激活路由
   * @param context 执行上下文
   * @returns 是否可以访问
   */
  async canActivate(context: ExecutionContext): Promise<boolean> {
    const result = (await super.canActivate(context)) as boolean
    const request = context.switchToHttp().getRequest()

    // 执行本地策略验证
    await super.logIn(request)

    return result
  }

  /**
   * 处理请求
   * @param err 错误信息
   * @param user 用户信息
   * @returns 用户信息
   */
  handleRequest(err: any, user: any) {
    if (err || !user) {
      throw err || new UnauthorizedException('用户名或密码错误')
    }
    return user
  }
}
